package IA;

import Motor.Habilidad;
import Motor.Hero;
import Motor.Juego;
import Motor.Luchador;
import Motor.Player;

public class Estado {
	
	//private EstadoCreencia posiblidad[];
	private int turno, fase;
	Juego j;
	
	public Estado(Juego _j, int f, int t){
		j=_j;
		turno=t;
		fase=f;
	}

	public Player getJugador(int i) {
		return j.getJugador()[i];
	}

	public Luchador getLuchador(int i) {
		return j.getLuchador()[i];
	}
	
	public void setJugador(Player p,int i) {
		j.setJugador(p,i);
	}

	public void setLuchador(Luchador l,int i) {
		j.setLuchador(l,i);
	}
	
	public int getTurno() {
		return turno;
	}
	
	public int getFase() {
		return fase;
	}
	
	public int numJugadores(){
		return j.getJugador().length;
	}
	
	public Estado copiar(){
		return new Estado(j.copiar(),fase,turno);
	}
	
	public Estado applyAction(Accion a,int n){
		Estado newState=this.copiar();
		Accion a_aux=new Accion(newState,a.getOperacion());
		newState=a_aux.getResult(n);
		while(newState.j.getJugador()[newState.turno].heroesVivos()==0){
			newState.turno++;
		}
		return newState;
	}
	
	public Accion[] getApplicableActions(int n) {
		
		Accion[] alternatives = new Accion[0];
		
		Accion act = null;
		for(int i =0; i<=13;i++){
			act = new Accion(this,i);
			if (this.isValidAction(act,n)) {
						alternatives=add(alternatives,act);
			}
		}
		return alternatives;
	}
	
	private Accion[] add(Accion[] alternatives, Accion act) {
		Accion[] aux=new Accion[alternatives.length+1];
		for(int i=0;i<alternatives.length;i++){
			aux[i]=alternatives[i];
		}
		aux[alternatives.length]=act;
		return aux;
	}

	public boolean isValidAction(Accion _action,int n) {
		Hero he;
		Habilidad h;
		try {
			switch (_action.getOperacion()) {
			case 0:
				return fase != 0;
			case 1:
				he = (Hero) getJugador(n).usarHero(0);
				return fase == 0 && he.getHlt() > 0;
			case 2:
				he = (Hero) getJugador(n).usarHero(1);
				return fase == 0 && he.getHlt() > 0;
			case 3:
				he = (Hero) getJugador(n).usarHero(2);
				return fase == 0 && he.getHlt() > 0;
			case 4:
				he = (Hero) getJugador(n).usarHero(3);
				return fase == 0 && he.getHlt() > 0;
			case 5:

				h = (Habilidad) getJugador(n).verCartaMano(0);
				he = getLuchador(n).getHero();
				if (getFase() == 1 && h != null) {
					return !h.isInstant() && h.getTipo() == he.getTipo();
				} else if (getFase() == 3 && h != null) {
					return h.isInstant() && h.getTipo() == he.getTipo();
				}
				break;
			case 6:
				h = (Habilidad) getJugador(n).verCartaMano(1);
				he = getLuchador(n).getHero();
				if (getFase() == 1 && h != null) {
					return !h.isInstant() && h.getTipo() == he.getTipo();
				} else if (getFase() == 3 && h != null) {
					return h.isInstant() && h.getTipo() == he.getTipo();
				}
				break;
			case 7:
				h = (Habilidad) getJugador(n).verCartaMano(2);
				he = getLuchador(n).getHero();
				if (getFase() == 1 && h != null) {
					return !h.isInstant() && h.getTipo() == he.getTipo();
				} else if (getFase() == 3 && h != null) {
					return h.isInstant() && h.getTipo() == he.getTipo();
				}
				break;
			case 8:
				return fase == 2 && j.getJugador()[n].getPillz() > 0;
			case 9:
				return fase == 2 && j.getJugador()[n].getPillz() > 1;
			case 10:
				return fase == 2 && j.getJugador()[n].getPillz() > 2;
			case 11:
				return fase == 2 && j.getJugador()[n].getPillz() > 3;
			case 12:
				return fase == 2 && j.getJugador()[n].getPillz() > 4;
			case 13:
				return fase == 2 && j.getJugador()[n].getPillz() > 5;
			}
		} catch (Exception e) {
			e.printStackTrace();
			System.out.println(j.getJugador().length+" "+n);
			System.out.println("Accion: "+_action.getOperacion());
		}
		return false;
	}
	
	public boolean isSolution(int n) {
		if (n<0 && n>=j.getJugador().length){
			return false;
		}else{
			boolean b=true;
			for(int i=0;i<j.getJugador().length;i++){
				if(i!=n){//si no soy yo q este muerto
					b=b&&j.getJugador()[i].heroesVivos()==0;
				}else{//si soy yo que este vivo
					b=b&&j.getJugador()[i].heroesVivos()!=0;
				}
			}
			return b;
		}
	}
	public boolean isDerrota(int n) {
		if (n<0 || n>=j.getJugador().length){
			return true;
		}else{
			return j.getJugador()[n].heroesVivos()==0;
		}
	}

	public void setTurno(int i) {
		turno=i;
	}
	
	public Player[] getJugador(){
		return j.getJugador();
	}
	
	public Luchador[] getLuchador(){
		return j.getLuchador();
	}

	public void setFase(int i) {
		// TODO Auto-generated method stub
		fase=i;
	}
	
	public void mostrar(){
		String s="###############################################################################\n";
		s+="Fase: "+fase+" Turno: "+turno+"\n";
		s+=j.mostrar()+"\n";
		s+="\n###############################################################################\n";
		System.out.println(s);
	}
	public void mostrar(Accion a){
		String s="###############################################################################\n";
		s+="Fase: "+fase+" Turno: "+turno+"\n";
		s+="Accion: "+a.getOperacion()+"\n";
		s+=j.mostrar()+"\n";
		s+="\n###############################################################################\n";
		System.out.println(s);
	}
	
	//public void generarEstadosCreencia(){
		
	//}

	
}
